package com.fmm.easy;

public class StocksBestTime {

    /**
     * @param prices 股票价格数组
     * @return 最大利润
     * */
    public static int maxProfit(int[] prices) {
        // 存放最大利润
        int maxProfit = 0;
        // 存放下拐点值（最低价）
        int minPrice = 0;
        // 标识上升中还是下降中
        boolean isUp = false;
        for (int i = 0; i < prices.length; i++) {
            // 第一个值无需处理，如果价格只有一个值，无法赚钱。
            if (i == 0) {
                continue;
            }
            // 如果是最后一个值，且最后一个值比前一个值大，需要计算最后一次赚的钱 + 前面赚的钱。
            // 如果最后一个值比前一个值小，不用计算，因为最后一次没赚到。
            if (i == prices.length - 1) {
                if (prices[i] > prices[i - 1]) {
                    if (isUp) {
                        maxProfit += prices[i] - minPrice;
                    } else {
                        maxProfit += prices[i] - prices[i - 1];
                    }
                }
            }

            // 本次的价格比上一次价格大，并且之前是处于下降中，那么前一次的价格就是下拐点（最低价）
            if (prices[i] > prices[i - 1]) {
                if (!isUp) {
                    // 更新最低价，当到达最高价的时候，用最高价 - 最低价得到利润
                    minPrice = prices[i - 1];
                    // 标识上升中
                    isUp = true;
                }
            } else {
                // 本次的价格比上个价格小，并且之前是处于上升中，那么上个价格就是上拐点（最高价）
                if (isUp) {
                    // 本次价格的前一次就是最高价，用最高价 - 最低价得到利润
                    maxProfit += prices[i - 1] - minPrice;
                    // 标识下降中
                    isUp = false;
                }
            }
        }
        return maxProfit;
    }

    public static void main(String[] args) {
        int[] prices = {7, 1, 5, 3, 6, 4};
        System.out.println(maxProfit(prices));

        prices = new int[] {1, 2, 3, 4, 5};
        System.out.println(maxProfit(prices));

        prices = new int[] {7, 6, 4, 3, 1};
        System.out.println(maxProfit(prices));
    }
}
